using System;
using System.Collections.Generic;
using System.Data;

using PMServiceDesk.DataType;

namespace PMServiceDesk.DataAccess
{
    public class PermisoRolPaqueteTrabajoData
    {
        #region Variables

        private string _select;
        private string _join;
        private string _where;
        private int _totalRegistros = 0;

        private Dictionary<string, object> _parametrosConsulta;

        #endregion

        #region Propiedades

        protected string Where
        {
            get
            {
                if (_where == "") return "";

                return "WHERE " + _where.Substring(3);
            }
        }

        #endregion

        #region Constructores

        public PermisoRolPaqueteTrabajoData()
        {
            this._limpiarConsulta();
        }

        #endregion

        #region Metodos

        private void _limpiarConsulta()
        {
            _select = "";
            _join = "";
            _where = "";
            _parametrosConsulta = new Dictionary<string, object>();
        }

        private DataUtil _consultaDataReader(int paginaActual = 0, int cantidadMostrar = 0, string orderBy = "")
        {
            DataUtil data = null;

            if(paginaActual==0)
                data = new DataUtil(TypeDataBase.PMServiceDesk, CommandType.Text, _select + _join + this.Where + orderBy, _parametrosConsulta);
            else
                data = DataReader.ReturnPagingReader(TypeDataBase.PMServiceDesk, _select, _join, this.Where, this._parametrosConsulta, paginaActual, cantidadMostrar, orderBy, ref _totalRegistros);

            this._limpiarConsulta();

            return data;
        }

        public void Grabar(PermisoRolPaqueteTrabajoType permisoRolPaqueteTrabajo)
        {
            using (DataUtil d = this._grabar())
            {
                d.AddParameter("@ID", (permisoRolPaqueteTrabajo.Id == null ? "0" : permisoRolPaqueteTrabajo.Id));
                d.AddParameter("@ROLID", permisoRolPaqueteTrabajo.RolId);
                d.AddParameter("@ESTADOPAQUETETRABAJOID", permisoRolPaqueteTrabajo.EstadoPaqueteTrabajoId);
                d.AddParameter("@PERMISO", permisoRolPaqueteTrabajo.Permiso);

                permisoRolPaqueteTrabajo.Id = d.ExecuteScalar(true).ToString();
            }
        }

        public PermisoRolPaqueteTrabajoType Cargar()
        {
            List<PermisoRolPaqueteTrabajoType> l = this.CargarLista();

            if (l.Count == 0) return null;

            return l[0];
        }

        public List<PermisoRolPaqueteTrabajoType> CargarLista()
        {
            List<PermisoRolPaqueteTrabajoType> l = new List<PermisoRolPaqueteTrabajoType>();

            using (DataUtil d = this._consultaCargar())
                using (IDataReader r = d.ExecuteReader())
                {
                    PermisoRolPaqueteTrabajoType o = null;

                    while (r.Read())
                    {
                        o = new PermisoRolPaqueteTrabajoType();

                        o.Id = r.GetValue(d.GetOrdinalReader("ID")).ToString();
                        o.RolId = r.GetValue(d.GetOrdinalReader("ROLID")).ToString();
                        o.EstadoPaqueteTrabajoId = r.GetValue(d.GetOrdinalReader("ESTADOPAQUETETRABAJOID")).ToString();
                        o.Permiso = r.GetValue(d.GetOrdinalReader("PERMISO")).ToString();

                        l.Add(o);
                    }
                }

            return l;
        }

        public List<PermisoRolPaqueteTrabajoType> CargarListaVista(int paginaActual = 0, int cantidadMostrar = 0, string orderBy = "")
        {
            List<PermisoRolPaqueteTrabajoType> l = new List<PermisoRolPaqueteTrabajoType>();

            using (DataUtil d = this._consultaCargarVista(paginaActual, cantidadMostrar,orderBy))
                using (IDataReader r = d.ExecuteReader())
                {
                    PermisoRolPaqueteTrabajoType o = null;

                    while (r.Read())
                    {
                        o = new PermisoRolPaqueteTrabajoType();

                        o.Id = r.GetValue(d.GetOrdinalReader("ID")).ToString();
                        o.RolId = r.GetValue(d.GetOrdinalReader("ROLID")).ToString();
                        o.EstadoPaqueteTrabajoId = r.GetValue(d.GetOrdinalReader("ESTADOPAQUETETRABAJOID")).ToString();
                        o.Permiso = r.GetValue(d.GetOrdinalReader("PERMISO")).ToString();

                        l.Add(o);
                    }
                }

            if (l.Count < _totalRegistros) l.Capacity = _totalRegistros;

            return l;
        }

        public List<PermisoRolPaqueteTrabajoType> CargarPermisos(string rolId)
        {
            List<PermisoRolPaqueteTrabajoType> l = new List<PermisoRolPaqueteTrabajoType>();

            using (DataUtil d = this._consultaCargarPermisos(rolId))
                using (IDataReader r = d.ExecuteReader())
                {
                    PermisoRolPaqueteTrabajoType o = null;

                    while (r.Read())
                    {
                        o = new PermisoRolPaqueteTrabajoType();

                        o.Id = r.GetValue(d.GetOrdinalReader("ID")).ToString();
                        o.RolId = r.GetValue(d.GetOrdinalReader("ROLID")).ToString();
                        o.TipoPaqueteTrabajoId = r.GetValue(d.GetOrdinalReader("TIPOPAQUETETRABAJOID")).ToString();
                        o.EstadoPaqueteTrabajoId = r.GetValue(d.GetOrdinalReader("ESTADOPAQUETETRABAJOID")).ToString();
                        o.Permiso = r.GetValue(d.GetOrdinalReader("PERMISO")).ToString();
                        o.TipoPaqueteTrabajo = r.GetValue(d.GetOrdinalReader("TIPOPAQUETETRABAJO")).ToString();
                        o.EstadoPaqueteTrabajo = r.GetValue(d.GetOrdinalReader("ESTADOPAQUETETRABAJO")).ToString();
                        o.Orden = r.GetValue(d.GetOrdinalReader("ORDEN")).ToString();
                        o.Transicion = r.GetValue(d.GetOrdinalReader("TRANSICION")).ToString();
                        if (o.Transicion != "") o.Transicion = o.Transicion.Substring(1);

                        l.Add(o);
                    }
                }

            return l;
        }

        #endregion

        #region SQL

        private DataUtil _grabar()
        {
            string sql = @"IF(NOT EXISTS(SELECT 1 FROM PERMISOROLPAQUETETRABAJO WHERE ID=@ID)) 
                           BEGIN
                               INSERT INTO PERMISOROLPAQUETETRABAJO
                               (
                                   ROLID
                                  ,ESTADOPAQUETETRABAJOID
                                  ,PERMISO
                               )
                               VALUES
                               (
                                   @ROLID
                                  ,@ESTADOPAQUETETRABAJOID
                                  ,@PERMISO
                               )

                               SELECT @@IDENTITY
                           END
                           ELSE
                           BEGIN
                               UPDATE PERMISOROLPAQUETETRABAJO SET
                               ROLID=@ROLID
                              ,ESTADOPAQUETETRABAJOID=@ESTADOPAQUETETRABAJOID
                              ,PERMISO=@PERMISO
                               WHERE ID=@ID

                               SELECT @ID
                           END";

            return new DataUtil(TypeDataBase.PMServiceDesk, CommandType.Text, sql);
        }

        private DataUtil _consultaCargar()
        {
            _select = @"SELECT
                        PE.ID
                       ,PE.ROLID
                       ,PE.ESTADOPAQUETETRABAJOID
                       ,PE.PERMISO
                        ";

            _join = @"FROM DBO.PERMISOROLPAQUETETRABAJO [PE] 
                      ";

            return this._consultaDataReader();
        }

        private DataUtil _consultaCargarVista(int paginaActual = 0, int cantidadMostrar = 0, string orderBy = "")
        {
            _select = @"SELECT
                        PE.ID
                       ,PE.ROLID
                       ,PE.ESTADOPAQUETETRABAJOID
                       ,PE.PERMISO
                        ";

            _join = @"FROM DBO.PERMISOROLPAQUETETRABAJO [PE] 
                      ";

            return this._consultaDataReader(paginaActual, cantidadMostrar, orderBy);
        }

        private DataUtil _consultaCargarPermisos(string rolId)
        {
            string sql = @"DECLARE @PROYECTOID INTEGER;

                           SET @PROYECTOID = (
                                                SELECT PROYECTOID 
                                                FROM ROL 
                                                WHERE ID=@ROLID 
                                             );

                            SELECT
                            PERMISOS.*
                           ,(
	                            SELECT
	                            ','
	                            + CAST(TREP.ESTADODESTINOID AS VARCHAR)
	                            FROM TRANSICIONESTADO TREP
	                            WHERE TREP.ESTADOORIGENID=PERMISOS.ESTADOPAQUETETRABAJOID
	                            AND TREP.HABILITADO=1
	                            FOR XML PATH('')
                            )                           [TRANSICION]
                            FROM
                            (
	                            SELECT
	                            PE.ID										[ID]
	                            ,PE.ROLID									[ROLID]
                                ,TPT.ID					                    [TIPOPAQUETETRABAJOID]
	                            ,PE.ESTADOPAQUETETRABAJOID					[ESTADOPAQUETETRABAJOID]
	                            ,TPT.NOMBRE									[TIPOPAQUETETRABAJO]
	                            ,EPT.NOMBRE									[ESTADOPAQUETETRABAJO]
	                            ,EPT.ORDEN									[ORDEN]
	                            ,PE.PERMISO									[PERMISO]
	                            FROM DBO.PERMISOROLPAQUETETRABAJO [PE] 
	                            INNER JOIN DBO.ESTADOPAQUETETRABAJO [EPT] ON PE.ESTADOPAQUETETRABAJOID = EPT.ID
	                            INNER JOIN DBO.TIPOPAQUETETRABAJO [TPT] ON EPT.TIPOPAQUETETRABAJOID=TPT.ID
	                            WHERE PE.ROLID=@ROLID
                                AND TPT.PROYECTOID=@PROYECTOID
	                            AND TPT.HABILITADO=1
	                            AND EPT.HABILITADO=1

	                            UNION ALL 
	 
	                            SELECT
	                            0											[ID]
	                            ,@ROLID 									[ROLID]
                                ,TPT.ID					                    [TIPOPAQUETETRABAJOID]
	                            ,EPT.ID										[ESTADOPAQUETETRABAJOID]
	                            ,TPT.NOMBRE									[TIPOPAQUETETRABAJO]
	                            ,EPT.NOMBRE									[ESTADOPAQUETETRABAJO]
	                            ,EPT.ORDEN									[ORDEN]
	                            ,0											[PERMISO]
	                            FROM DBO.ESTADOPAQUETETRABAJO [EPT] 
	                            INNER JOIN DBO.TIPOPAQUETETRABAJO [TPT] ON EPT.TIPOPAQUETETRABAJOID=TPT.ID
	                            WHERE TPT.PROYECTOID=@PROYECTOID
                                AND TPT.HABILITADO=1
	                            AND EPT.HABILITADO=1
	                            AND EPT.ID NOT IN (SELECT PPT.ESTADOPAQUETETRABAJOID FROM DBO.PERMISOROLPAQUETETRABAJO [PPT] WHERE PPT.ROLID=@ROLID)
                            ) [PERMISOS]
                            ORDER BY PERMISOS.TIPOPAQUETETRABAJO,PERMISOS.ORDEN
                          ";

            Dictionary<string,object> parametros = new Dictionary<string,object>();
            parametros.Add("@ROLID",rolId);

            return new DataUtil(TypeDataBase.PMServiceDesk, CommandType.Text, sql, parametros);
        }

        public void FiltrarPorId(string id)
        {
            _where += @"AND PE.ID=@ID
                                 ";

            _parametrosConsulta.Add("@ID", id);
        }
        public void FiltrarPorRolId(string rolId)
        {
            _where += @"AND PE.ROLID=@ROLID
                                 ";

            _parametrosConsulta.Add("@ROLID", rolId);
        }
        public void FiltrarPorEstadoPaqueteTrabajoId(string estadoPaqueteTrabajoId)
        {
            _where += @"AND PE.ESTADOPAQUETETRABAJOID=@ESTADOPAQUETETRABAJOID
                                 ";

            _parametrosConsulta.Add("@ESTADOPAQUETETRABAJOID", estadoPaqueteTrabajoId);
        }

        #endregion
    }
}
